#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    signal(SIGCHLD, SIG_IGN);//手动设置对SIGCHLD忽略

    pid_t id=fork();
    if(id==0)
    {
        int cnt=5;
        while(cnt)
        {
            std::cout<<"child running"<<std::endl;
            cnt--;
            sleep(1);
        }

        exit(1);
    }


    while(true)
        {
            std::cout<<"father running"<<std::endl;
            
            sleep(1);
        }
}



















// 挑问题了
// 问题1: 如果一共有10个子进程，且同时退出呢？
// 问题2: 如果一共有10个子进程, 5个退出，5个永远不退出呢？
// 阻塞
// void notice(int signo)
// {
//     std::cout << "get a signal: " << signo << "pid: " << getpid() << std::endl;
//     while (true)
//     {
//         pid_t rid = waitpid(-1, nullptr, WNOHANG); // 非阻塞
//         // pid_t rid = waitpid(-1, nullptr, 0);

//         if (rid > 0)
//         {
//             std::cout << "wait child sucess,rid: " << rid << std::endl;
//         }
//         else if (rid < 0)
//         {
//             std::cout << "wait child sucess done" << std::endl;
//             break;
//         }
//         else
//         {
//             std::cout << "wait child sucess done" << std::endl;
//             break;
//         }
//     }
// }

// void DoOtherThing()
// {
//     std::cout << "DoOtherThing~" << std::endl;
//     sleep(1);
// }

// int main()
// {
//     signal(SIGCHLD, notice);
//     for (int i = 0; i < 10; i++)
//     {
//         pid_t id = fork();
//         if (id == 0)
//         {
//             std::cout << "i am child process, pid: " << getpid() << std::endl;
//             sleep(3);
//             exit(1);
//         }
//     }

//     // father
//     // sleep(100);
//     while (true)
//     {
//         DoOtherThing();
//     }
//     return 0;
// }

// volatile int gflag =0;

// void changedata(int signo)
// {
//     std::cout<<"get a signo: "<<signo<<",change gflag 0->1"<<std::endl;
//     gflag=1;
// }

// int main()//没有任何代码对gflag进行修改

// {

//     signal(2,changedata);

//     while(!gflag);//while不要其他代码
//     std::cout<<"process quit normal"<<std::endl;

// }

// void Print(sigset_t &pending)
// {
//     for(int sig=31;sig>0;sig--)
//     {
//         if(sigismember(&pending,sig))
//         {
//             std::cout<<1;
//         }
//         else
//         {
//             std::cout<<0;

//         }
//     }
//     std::cout<<std::endl;
// }

// //当前如果正在对n号信号进程处理，默认n号信号会屏蔽
// //对n号信号处理完成时，自动解除屏蔽
// void handler(int signum)
// {
//     std::cout<<"get a sig: "<<signum<<std::endl;
//    // sleep(100);
//    while(true)
//    {
//      sigset_t pending;
//      sigpending(&pending);

//      Print(pending);
//      sleep(1);
//          //  sleep(30);
//     //  break;
//    }
//     //exit(1);
// }

// int main()
// {
//     struct sigaction act,oact;
//     act.sa_handler=handler;
//     sigemptyset(&act.sa_mask);
//     //// 如果你还想处理2号(OS对2号自动屏蔽)，同时对其他信号也进行屏蔽
//      sigaddset(&act.sa_mask,3);
//     act.sa_flags=0;

//     for(int i=0;i<=31;i++)
//         sigaction(i,&act,&oact);

//    //sigaction(2,&act,&oact);

//     while(true)
//     {
//         std::cout<<"i am a process. pid: "<<getpid()<<std::endl;
//         sleep(1);

//     }

//     return 0;
// }